feat(transform): classify references inside LANGUAGE sql function bodies - #320
Merged
Conversation
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
classifyStatementsdiscovered references inside PL/pgSQL bodies (via the hydrated plpgsql walk) but treated aLANGUAGE sqlfunction body supplied as a string literal (AS $$ … $$) as opaque — so its references were invisible:This is a correctness gap for any consumer that builds a dependency/reachability graph from the classifier facts: a
LANGUAGE sqlfunction reading a table produced no edge to that table.LANGUAGE sqlbodies are extremely common, so the missing edges are not an edge case.What changed
facts.tsnow mirrors the schema transformer's existing body handling (transformSqlBodyString): for aCreateFunctionStmtwhoselanguageoption issql, it pulls the body string out of theasDefElem list, parses it standalone withparseSql, and walks each statement with the same facts visitor used for the outer AST — feeding bothreferencesandbodyReferences.Scope guards:
LANGUAGE sqlstring bodies are parsed.LANGUAGE c(AS 'MODULE_PATHNAME','sym') and other languages are left untouched (verified by test).BEGIN ATOMIC … END/RETURNsql_bodyform is already part of the AST and covered by the outer walk — untouched here.Tests
__tests__/facts.test.ts: adds coverage for reference extraction from aLANGUAGE sqlstring body (into bothreferencesandbodyReferences, excluding self-ref) and a negative test that aLANGUAGE cbody string is not parsed as SQL. Full suite: 174 passed (172 previous + 2 new).Downstream
Consumed by pgpm's shared/per-tenant object partitioner (constructive), which classifies which changes are safe to deploy once vs. must be materialized per tenant — soundness there depends on seeing references inside
LANGUAGE sqlbodies. Needs a publish to be consumed downstream.Link to Devin session: https://app.devin.ai/sessions/025fb88043964fdbb335ac5e39df2478
Requested by: @pyramation